# uncompyle6 version 3.2.3
# Python bytecode 3.6 (3379)
# Decompiled from: Python 3.6.8 |Anaconda custom (64-bit)| (default, Feb 21 2019, 18:30:04) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: multiprocessing\popen_fork.py
import os, sys, signal
from . import util

__all__ = ["Popen"]


class Popen(object):
    method = "fork"

    def __init__(self, process_obj):
        try:
            sys.stdout.flush()
        except (AttributeError, ValueError):
            pass

        try:
            sys.stderr.flush()
        except (AttributeError, ValueError):
            pass

        self.returncode = None
        self._launch(process_obj)

    def duplicate_for_child(self, fd):
        return fd

    def poll(self, flag=os.WNOHANG):
        if self.returncode is None:
            while True:
                try:
                    pid, sts = os.waitpid(self.pid, flag)
                except OSError as e:
                    return

                break

            if pid == self.pid:
                if os.WIFSIGNALED(sts):
                    self.returncode = -os.WTERMSIG(sts)
                else:
                    if not os.WIFEXITED(sts):
                        raise AssertionError
                    self.returncode = os.WEXITSTATUS(sts)
                return self.returncode

    def wait(self, timeout=None):
        if self.returncode is None:
            if timeout is not None:
                from multiprocessing.connection import wait

                if not wait([self.sentinel], timeout):
                    return
                return self.poll(os.WNOHANG if timeout == 0.0 else 0)
            return self.returncode

    def terminate(self):
        if self.returncode is None:
            pass
        try:
            os.kill(self.pid, signal.SIGTERM)
        except ProcessLookupError:
            pass
        except OSError:
            if (self.wait(timeout=0.1)) is None:
                raise

    def _launch(self, process_obj):
        code = 1
        parent_r, child_w = os.pipe()
        self.pid = os.fork()
        if self.pid == 0:
            try:
                os.close(parent_r)
                if "random" in sys.modules:
                    import random

                    random.seed()
                code = process_obj._bootstrap()
            finally:
                os._exit(code)

        else:
            os.close(child_w)
            util.Finalize(self, os.close, (parent_r,))
            self.sentinel = parent_r
